﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using CRC.Incidencias.Dominio.Clases;
using CRC.GestionSalones.Dominio.Clases;
using System.IO;
using System.Drawing;

namespace CRC.Incidencias.Dominio.Controladores
{
    public class ControladorGestionFotosIncidencia
    {
        Incidencia inc = null;

        private static String strMiniaturasDeIncidencia =
            "select f.Id, f.Nombre, f.miniatura, f.Comentario " +
            "from Incidencia inc " +
            "inner join inc.Fotos f " + 
            "where inc.Id=:IdInc " +
            "and f.Categoria.Id=1 " + 
            "order by f.Nombre";

        private static String strQryInsertaFotoIncidencia = 
            "insert into salones_fotos_incidencia " +
            "values(:incidencia, :foto)";

        private static String strQryEliminarFotoIncidencia = "delete from salones_fotos_incidencia where foto_id = :foto";
        private static String strQryEliminarFotoSalon = "delete from salones_fotos where id = :foto";


        /// <summary>
        ///  Da los id, la miniaturam, el nombre y un comentario 
        ///  de las fotos del salon con la categoria pIntCat
        /// </summary>
        /// <param name="pIntIncidencia">Identificador de la incidencia</param>
        public IList<Object[]> listarFotos(int pIntIncidencia) 
        {
            ISession session = null;
            IList<Object[]> res = null, aux = null;
            try
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();

                this.inc = (Incidencia)session.Get(typeof(Incidencia), pIntIncidencia);

                IQuery qry = session.CreateQuery(strMiniaturasDeIncidencia);
                qry.SetParameter("IdInc", pIntIncidencia);

                aux = qry.List<Object[]>();

                res = new List<Object[]>();
                foreach (Object[] f in aux) 
                {
                    Byte[] img = (Byte[])f[2];
                    res.Add(new Object[] { f[0], f[1], Image.FromStream(new MemoryStream(img)), f[3], (img.Length / 1024)});
                }

                return res;
            }
            catch (HibernateException he)
            {
                if (session != null) session.Close();
                throw he;
            }
        }

        public Object[] nuevaFoto(String pStrRuta, String pStrCom) {

            ISession session = null;
            ITransaction tx = null;
            try 
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                Foto f = inc.Salon.nuevaFoto(pStrRuta,
                    (Categoria)session.Get(typeof(Categoria), 1),
                    pStrCom);
                session.Flush();

                IQuery qry = session.CreateSQLQuery(strQryInsertaFotoIncidencia);
                qry.SetParameter("incidencia", inc.Id);
                qry.SetParameter("foto", f.Id);
                qry.ExecuteUpdate();

                tx.Commit();

                return new Object[] { f.Id, f.Miniatura(),f.Nombre, f.Comentario, f.TamañoEnKB};
            }
            catch (HibernateException he) 
            {
                if (tx != null) tx.Rollback();
                if (session != null) session.Close();
                throw he;
            }
        }

        public void eliminarFoto(int pIntId)
        {
            ISession session = null;
            ITransaction tx = null;
            
            try 
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                IQuery qry = session.CreateSQLQuery(strQryEliminarFotoIncidencia).SetParameter("foto", pIntId);
                qry.ExecuteUpdate();

                qry = session.CreateSQLQuery(strQryEliminarFotoSalon).SetParameter("foto", pIntId);
                qry.ExecuteUpdate();

                tx.Commit();

            }
            catch (HibernateException he)
            {
                if (tx != null) tx.Rollback();
                if (session != null) session.Close();
                throw he;
            }
        }

        public Object verFoto(int pIntFoto)
        {
            ISession session = null;
            try
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                Foto f = (Foto)session.Get(typeof(Foto), pIntFoto);
                return f.Imagen();
            }
            catch (HibernateException he)
            {
                if (session != null) session.Close();
                throw he;
            }
        }
    }
}
